package pe.edu.upc.dsd.epica.dao;


import java.util.List;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import pe.edu.upc.dsd.epica.model.Establecimiento;

public class EstablecimientoDaoJdbc extends SimpleJdbcDaoSupport implements EstablecimientoDao{

	@Override
	public void save(Establecimiento establecimiento) {
		getSimpleJdbcTemplate().update("insert into establecimientos(codigo, nombre, descripcion,categoria,longitud,latitud,imagen,login,password) values(?,?,?,?,?,?,?,?,?)",
				establecimiento.getCodigo(),
				establecimiento.getNombre(),
				establecimiento.getDescripcion(),
				establecimiento.getCategoria(),
				establecimiento.getLongitud(),
				establecimiento.getLatitud(),
				establecimiento.getImagen(),
				establecimiento.getLogin(),
				establecimiento.getPassword());
		
	}

	@Override
	public void update(Establecimiento establecimiento) {
		getSimpleJdbcTemplate().
		update("update `establecimientos` set nombre=?,descripcion=?,categoria=?,longitud=?,latitud=?,imagen=?,login=?,password=? where codigo=?", 
				establecimiento.getNombre(),
				establecimiento.getDescripcion(),
				establecimiento.getCategoria(),
				establecimiento.getLongitud(),
				establecimiento.getLatitud(),
				establecimiento.getImagen(),
				establecimiento.getLogin(),
				establecimiento.getPassword(),
				establecimiento.getCodigo());		
	}

	@Override
	public void delete(String codigo) {
		getSimpleJdbcTemplate().update("delete from `establecimientos` where codigo=?",codigo);	
	}

	@Override
	public Establecimiento findByEstablecimientoCode(String codigo) {
		return getSimpleJdbcTemplate().
				queryForObject("select codigo, nombre, descripcion,categoria,longitud,latitud,imagen,login,password from `establecimientos` where codigo = ?", 
				new BeanPropertyRowMapper<Establecimiento>(Establecimiento.class), codigo);
	}


	@Override
	public Establecimiento findByUsuarioAndPassword(String login, String password) {
		return getSimpleJdbcTemplate().
				queryForObject("select codigo, nombre, descripcion,categoria,longitud,latitud,imagen,login,password from `establecimientos` where login = ? and password= ?", 
				new BeanPropertyRowMapper<Establecimiento>(Establecimiento.class), login ,password);
	}

	@Override
	public List<Establecimiento> findEstablecimientoWithPromocion(double longitud,double latitud) {
		return getSimpleJdbcTemplate().
				query("SELECT DISTINCT E.*, SQRT((POWER((?)-`longitud`,2) + POWER((?)-`latitud`,2))) AS dif FROM ESTABLECIMIENTOS AS E INNER JOIN PROMOCIONES AS P ON E.`codigo` = P.`CodEstablecimiento` WHERE P.`fecVencimiento`> CURDATE() ORDER BY  dif ASC LIMIT 10", 
						new BeanPropertyRowMapper<Establecimiento>(Establecimiento.class),longitud,latitud);
	}
		
	@Override
	public List<Establecimiento> findbyCategoriaPromNoVen(String categoria) {
		return getSimpleJdbcTemplate().
				query("SELECT DISTINCT E.* FROM ESTABLECIMIENTOS AS E INNER JOIN PROMOCIONES AS P ON E.`codigo` = P.`CodEstablecimiento` WHERE E.`categoria`=? AND P.`fecVencimiento`> CURDATE()", 
						new BeanPropertyRowMapper<Establecimiento>(Establecimiento.class),categoria);
	}
	
	@Override
	public List<Establecimiento> findbyPromNoVen() {
		return getSimpleJdbcTemplate().
				query("SELECT  * FROM ESTABLECIMIENTOS", 
						new BeanPropertyRowMapper<Establecimiento>(Establecimiento.class));
	}
		
}
